package com.shimao.celnet.payment.util;

import com.shimao.celnet.payment.config.ConstantConfig;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @Author christ.lai
 * @Description 获取计费系统token，存放在redis里面，并且每一个小时进行更新
 * @Date 17:26 2018/8/8
 */
@Component
public class GetJFSystemToken {
    protected Logger logger = Logger.getLogger(this.getClass());

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private ConstantConfig constantConfig;

    @Autowired
    private HttpSendPostUtil httpSendPostUtil;

    public String getJFSystemNewToken(String appKey,String interfaceId){
        String token = "";
        String tokenRedisKey = "jf:token";
        //先从redis里面取，如果有而且为超时，从里面取，如果超时，则重新生成
        ValueOperations<String, String> operations = redisTemplate.opsForValue();
        // 缓存存在
        boolean hasKey = redisTemplate.hasKey(tokenRedisKey);
        logger.info("获取token："+"*********************"+hasKey);
        if (hasKey){
            //直接取
            token = operations.get(tokenRedisKey);
            return token;
        }
        /**
         * 物业计费的接口验证规则
         * 只接受来自物业的费用
         */
        String nonce = String.valueOf(System.currentTimeMillis());//随机字符串
        String URL = null;
        try {
            URL = constantConfig.getWyTokenURL()
                    + "?username=" + constantConfig.getWyUserName()
                    + "&password=" + SignCheckUtil.getWySign(nonce, constantConfig.getWyUserName(), constantConfig.getWyPassword())
                    + "&nonce=" + nonce;
        } catch (Exception e) {
            e.printStackTrace();
        }
        String result = httpSendPostUtil.sendPost(URL,appKey,interfaceId);
        token = JSONObject.fromObject(result).getString("token");
        if (StringUtils.isNotEmpty(token)){
            /**
             * 插入缓存
             * 设置 key 的值为 value
             * 其它规则与 set(K key, V value)一样
             * @param key 不能为空
             * @param value 设置的值
             * @param timeout 设置过期的时间 1小时
             * @param unit 时间单位。不能为空 （小时）
             * */

            logger.info("**********************"+token);
            operations.set(tokenRedisKey, token, 1L, TimeUnit.HOURS);
        }
        return token;
    }

    public String getJFSystemNewToken6001(String appKey,String interfaceId){
        String token = "";
        String tokenRedisKey = "jf:token";
        //先从redis里面取，如果有而且为超时，从里面取，如果超时，则重新生成
        ValueOperations<String, String> operations = redisTemplate.opsForValue();
        // 缓存存在
        /*boolean hasKey = redisTemplate.hasKey(tokenRedisKey);
        System.out.println("*********************"+hasKey);
        if (hasKey){
            //直接取
            token = operations.get(tokenRedisKey);
            return token;
        }*/
        /**
         * 物业计费的接口验证规则
         * 只接受来自物业的费用
         */
        String nonce = String.valueOf(System.currentTimeMillis());//随机字符串
        String URL = null;
        try {
            URL = constantConfig.getWyTokenURL()
                    + "?username=" + constantConfig.getWyUserName()
                    + "&password=" + SignCheckUtil.getWySign(nonce, constantConfig.getWyUserName(), constantConfig.getWyPassword())
                    + "&nonce=" + nonce;
        } catch (Exception e) {
            e.printStackTrace();
        }
        String result = httpSendPostUtil.sendPost(URL,appKey,interfaceId);
        token = JSONObject.fromObject(result).getString("token");
        if (StringUtils.isNotEmpty(token)){
            /**
             * 插入缓存
             * 设置 key 的值为 value
             * 其它规则与 set(K key, V value)一样
             * @param key 不能为空
             * @param value 设置的值
             * @param timeout 设置过期的时间 1小时
             * @param unit 时间单位。不能为空 （小时）
             * */
            logger.info(6001+":**********************:"+token);
            operations.set(tokenRedisKey, token, 1L, TimeUnit.HOURS);
        }
        return token;
    }
}
